from keras.datasets import mnist  #直接从keras里面应用数据集
from keras.utils import np_utils  #keras 里面用到的一个 np 的工具包
from keras.models import Sequential
from keras.layers import Dense,Dropout #导入Dropt
from keras.optimizers import SGD  #优化函数;


#载入数据
(x_train,y_train),(x_test,y_test)=mnist.load_data() #分为测试集和训练集

print(x_train.shape)
print(y_train[5])

# (6000,28,28) -> (6000,784)

x_train=x_train.reshape(x_train.shape[0],-1)/255.0 #-1表示是自动判断,/225是表示归一化。
x_test=x_test.reshape(x_test.shape[0],784)/255.0#行数是 x_train.shape[0]行。

#标签转换成 one hot 格式
y_train=np_utils.to_categorical(y_train,num_classes=10)#专门用来转格式的包
y_test=np_utils.to_categorical(y_test,num_classes=10)


#创建模型的简单写法
model=Sequential([
    Dense(units=200,input_dim=784,bias_initializer='one',activation="tanh"),
    Dropout(0.4),#让40%的神经元不工作.
    Dense(units=100,bias_initializer='one',activation="tanh"),
    Dropout(0.4), #让40的神经元不工作.
    Dense(units=10, bias_initializer='one', activation="softmax")
])

# 优化器，训练过程种计算准确率。
sgd=SGD(lr=0.2)
#把损失函数换成交叉熵
lossa="categorical_crossentropy"
model.compile(optimizer=sgd,loss=lossa,metrics=['accuracy'])#同时计算精确度.


#训练的方式
#训练的批次是32，迭代周期是 10 把6w 张图片训练完一次是一次轮回，现在是 10 次轮回.
model.fit(x_train,y_train,batch_size=32,epochs=10)

#评估模型;
loss,accuracy=model.evaluate(x_test,y_test)
print("test-loss*********",loss)
print("test-accuracy*****",accuracy)

#也可以放入训练的数据做一个测试：
loss,accuracy=model.evaluate(x_train,y_train)
print("train-loss*********",loss)
print("train-accuracy*****",accuracy)